package com.fyy.scheduled.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;

import java.util.concurrent.ThreadPoolExecutor;

/**
 * @Author fyy
 * @Description 自定义任务线程池
 * @Date 2020/12/18 9:53
 */
@Configuration
public class ScheduledConfig implements SchedulingConfigurer {

    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
        //线程池大小
        taskScheduler.setPoolSize(10);
        //设置线程名称前缀
        taskScheduler.setThreadNamePrefix("scheduled-thread-");
        //设置线程池关闭时等待所有线程任务完成后再销毁其它的bean
        taskScheduler.setWaitForTasksToCompleteOnShutdown(true);
        //设置线程池中任务的等待时间，如果超过这个时间还没有销毁就强制销毁，以确保应用最后能被关闭
        taskScheduler.setAwaitTerminationSeconds(60);
        /**
         * 采用CallerRunsPolicy策略，当线程池没有处理能力的时候，
         * 该策略会直接在execute方法的调用线程中运行被拒绝的任务
         * 如果执行程序已关闭，则会丢弃该任务
         */
        taskScheduler.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        taskScheduler.initialize();
        //设置默认线程池
        scheduledTaskRegistrar.setTaskScheduler(taskScheduler);

    }

}
